package com.liu.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.liu.entity.NocvData;
import com.liu.service.IndexService;
import com.liu.vo.DataView;
import com.liu.vo.NocvDataVo;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

@Controller
public class ChinaDataAdminController {

    @Autowired
    private IndexService indexService;
    //跳转页面
    @RequestMapping("/toChinaManager")
    public String toChinaData(){
        return "admin/chinadatamanager";
    }

    /**
     *模糊查询 带有分页
     * @return
     */
    @RequestMapping("/listDataByPage")
    @ResponseBody
    public DataView listDataByPage(NocvDataVo nocvDataVo){
        //1、创建分页的对象 当前页 每页限制大小
        IPage<NocvData> page = new Page<>(nocvDataVo.getPage(), nocvDataVo.getLimit());

        //2、创建模糊查询条件
        QueryWrapper<NocvData> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(!(nocvDataVo.getName() == null),"name",nocvDataVo.getName());

        //3、疫情数据确诊最多的排在最上面
        queryWrapper.orderByDesc("value");

        //4、查询数据库
        indexService.page(page,queryWrapper);

        //5、返回封装数据
        DataView dataView = new DataView(page.getTotal(),page.getRecords());

        return dataView;
    }

    /**
     * 根据Id删除数据
     * @param id
     * @return
     */
    @RequestMapping("/china/deleteById")
    @ResponseBody
    public DataView deleteById(Integer id){
        indexService.removeById(id);
        DataView dataView = new DataView();
        dataView.setCode(200);
        dataView.setMsg("删除中国疫情地图成功");
        return dataView;
    }

    /**
     * 新增或修改【id]
     * id:有值就是修改，无值就是新增
     * update nocv_data set name = "" where id = ?
     * insert into
     * @param nocvData
     * @return
     */
    @RequestMapping("/china/addOrUpdateChina")
    @ResponseBody
    public DataView addOrUpdateChina(NocvData nocvData){
        boolean save = indexService.saveOrUpdate(nocvData);
        DataView dataView = new DataView();
        if(save){
            dataView.setCode(200);
            dataView.setMsg("新增或修改中国疫情地图成功");
            return dataView;
        }
        dataView.setCode(100);
        dataView.setMsg("新增或修改中国疫情地图失败");
        return dataView;
    }

    /**
     * Excel的拖拽或者点击上传
     * 1。前台页面发送一个请求，上传文件MutilpartFile HTTP
     * 2.Controller,上传文件MutilpartFile 参数
     * 3.POI解析文件，里面的数据一行一行全部解析出来
     * 4.每一条数据插入数据库
     */

    /**
     * Excel导入功能
     * @param file
     * @return
     */
    @RequestMapping("excelImportChina")
    @ResponseBody
    public DataView excelImportChina(@RequestParam("file")MultipartFile file){
        DataView dataView = new DataView();

        //1、文件不能为空
        if(file.isEmpty()){
            dataView.setMsg("文件为空，不能上传");
            return dataView;
        }

        //2、POI获取Excel解析数据
        XSSFWorkbook wb = null;
        try {
            wb = new XSSFWorkbook(file.getInputStream());
            XSSFSheet sheet = wb.getSheetAt(0);

            //3、定义一个程序集合 接受 文件中的数据
            List<NocvData> list = new ArrayList<>();
            XSSFRow row = null;

            //4、解析数据，装到集合里面
            for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
                //4.1 定义实体
                NocvData nocvData = new NocvData();
                //4.2 每一行的数据
                row = sheet.getRow(i);
                //4.3 解析数据
                nocvData.setName(row.getCell(0).getStringCellValue());
                nocvData.setValue((int) row.getCell(1).getNumericCellValue());
                //添加list集合
                list.add(nocvData);
            }
            //5、插入数据库
            indexService.saveBatch(list);
            dataView.setCode(200);
            dataView.setMsg("Excel表已经插入成功");

            return dataView;
        } catch (IOException e) {
            e.printStackTrace();
        }
        dataView.setCode(100);
        dataView.setMsg("导入失败");
        return dataView;
    }

    /**
     * 导出Excel数据 中国疫情数据
     * 1.查询数据库
     * 2.建立Excel对象
     * 3.建立输出流，输出文件
     */
    @RequestMapping("/excelOutPortChina")
    @ResponseBody
    public void excelOutPortChina(HttpServletResponse response) throws IOException {
        //1、查询数据库
        List<NocvData> list = indexService.list();

        //2、建立Excel对象，封装数据
        response.setCharacterEncoding("UTF-8");
        //2.1 创建Excel对象
        XSSFWorkbook wb = new XSSFWorkbook();
        //2.2 创建sheet对象
        XSSFSheet sheet = wb.createSheet("中国疫情数据表");
        //2.3 创建表头
        XSSFRow xssfRow = sheet.createRow(0);
        xssfRow.createCell(0).setCellValue("城市名称");
        xssfRow.createCell(1).setCellValue("确诊数量");

        //3、遍历数据，封装Excel工作对象
        for(NocvData data : list){
            XSSFRow dataRow = sheet.createRow(sheet.getLastRowNum()+1);
            dataRow.createCell(0).setCellValue(data.getName());
            dataRow.createCell(1).setCellValue(data.getValue());
        }

        //建立输出流，输出游览器文件
        OutputStream os = null;
        //4.1 设置一下Excel名字,输出类型编码
        response.setContentType("application/octet-stream;chartset=utf-8");
        response.setHeader("Content-Disposition","attachment;filename="+new String("中国疫情数据表".getBytes(),"iso-8859-1")+".xlsx");
        //4.2 输出文件
        os = response.getOutputStream();
        wb.write(os);
        os.flush();

        //5、关闭输出流
        os.close();
    }
}
